﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using csharp.rad.general; 
using ComponentFactory.Krypton.Toolkit;

namespace csharp.rad.GOVhotel
{
    public partial class Situação : KryptonForm
    {
        Database myDBase;
        int nmApto, aptIdx, rotRet;
        string aptLivre, aptStatus;

        public Situação(Database myDBase)
        {
            InitializeComponent();
            this.myDBase = myDBase;
            int numo;
            for (int blk = 1; blk < 6; blk++)
            {
                for (int col = 1; col < 5; col++)
                {
                    for (int lna = 1; lna < 9; lna++)
                    {
                        numo = (blk * 1000) + (lna * 100) + col;
                        vewApto.Items.Add(numo.ToString("  0_000   ") + "TESTE",0);
                    }
                }
            }
        }

        private void Form_Load(object sender, EventArgs e)
        {
            int dbRet = Form_Monta_Tarefa();
            if (dbRet != 0) return;
            dbRet = Form_MontaStatus();
            if (dbRet != 0) return;
            vewApto.Focus();  
        }

        private int Form_MontaStatus()
        {
            Apartamentos tabApto = new Apartamentos(myDBase);
            int dbRet = tabApto.Lista();
            if (dbRet != 0)
            {
                MessageBox.Show("Favor avisar a RamaSoft\n" 
                    + "referência: SituaLoadStatus\n" + tabApto.MsgErro,
                    "Erro no acesso ao Banco de Dados", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return 7;
            }
            for (int ap = 0; ap < vewApto.Items.Count; ap++)
            {
                string qNumo = tabApto.Items[ap].Apto.ToString();
                int blk = Convert.ToInt32 (qNumo[0].ToString());
                blk = blk - 1;
                int col = Convert.ToInt32(qNumo[1].ToString());
                col = col - 1;
                int lna = Convert.ToInt32(qNumo[3].ToString());
                lna = lna - 1;
                int Idx = (blk * 32) + (lna * 8) + col;
                string qSitua = "";
                int qIcon = 0;
                if (tabApto.Items[ap].Status == "M")
                {
                    qSitua = "MANUT";
                    qIcon = 4;
                }
                else 
                {
                    if (tabApto.Items[ap].Livre != "L") qIcon = 2;
                    else qIcon = 0;
                    if (tabApto.Items[ap].Status != "L")
                    {
                        qSitua = "  SUJO";
                        qIcon = qIcon + 1;
                    }
                    else
                    {
                        qSitua = " limpo";
                    }
                }
                vewApto.Items[Idx].Name = qNumo;
                vewApto.Items[Idx].Tag = tabApto.Items[ap].Livre.ToString() + tabApto.Items[ap].Status.ToString();
                qNumo = qNumo.Insert(1, "_"); 
                vewApto.Items[Idx].Text = "  " + qNumo + "   " + qSitua;
                vewApto.Items[Idx].ImageIndex = qIcon; 
            }
            return 0;
        }

        private int Form_Monta_Tarefa()
        {
            Tarefa tafDia = new Tarefa(myDBase);
            tafDia.Data = DateTime.Today;
            int dbRet = tafDia.Existe();
            if (dbRet == 7)
            {
                MessageBox.Show("Favor avisar a RamaSoft" + "\n"
                    + "referência: SituaLoadTarefa" + "\n" + tafDia.MsgErro,
                    "Erro no acesso ao Banco de Dados", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return 7;
            }
            if (dbRet == 1) return 0;
            dbRet = tafDia.SetCarga();
            if (dbRet != 0)
            {
                MessageBox.Show("Favor avisar a RamaSoft" + "\n"
                    + "referência: SituaLoadCarga" + "\n" + tafDia.MsgErro,
                    "Erro no acesso ao Banco de Dados", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return 7;
            }
            return 0;
        }

        private void cmdVoltar_Click(object sender, EventArgs e)
        {
            this.Close(); 
        }

        private void vewApto_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)Keys.Space) vewApto_Click(sender, e);
        }

        private void vewApto_Click(object sender, EventArgs e)
        {
            aptIdx = vewApto.SelectedIndices[0];
            nmApto = Convert.ToInt32(vewApto.Items[aptIdx].Name.ToString());
            int qImage = vewApto.Items[aptIdx].ImageIndex;
            string aux = vewApto.Items[aptIdx].Tag.ToString();
            aptLivre = aux[0].ToString();
            aptStatus = aux[1].ToString();
            vewApto.Items[aptIdx].Selected = false;
            vewSitua.Items.Clear();
            string qEstado = " limpo";
            string qOpç = "123";
            if (aptStatus == "M")
            {
                qOpç = "024";
                qEstado = "MANUT";
            }
            else if (aptLivre == "L")
            {
                qOpç = "023";
                if (aptStatus == "S") qEstado = "  SUJO";
            }
            if (aptStatus == "S") qEstado = "  SUJO";
            for (int xx = 0; xx < 3; xx++)
            {
                int kk = Convert.ToInt32(qOpç[xx].ToString());
                vewSitua.Items.Add(vewOpções.Items[kk].Text, vewOpções.Items[kk].ImageIndex);
            }
            vewQueApto.Items[0].Text = nmApto.ToString("  0_000  ") +  qEstado;
            vewQueApto.Items[0].ImageIndex = qImage;
            janQuant.Visible = false;
            cmdOK.Visible = false;
            avisoOK.Visible = false; 
            janApto.Visible = true;
            vewSitua.Focus();  
        }

        private void cmdFechar_Click(object sender, EventArgs e)
        {
            janApto.Visible = false;
        }

        private void vewSitua_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)Keys.Space) vewSitua_Click(sender, e);
        }

        private void vewSitua_Click(object sender, EventArgs e)
        {
            int qIdx = vewSitua.SelectedIndices[0];
            vewSitua.Items[qIdx].Selected = false;
            int qImag = vewSitua.Items[qIdx].ImageIndex;
            string qTexto = vewSitua.Items[qIdx].Text;
            vewSitua.Items.Clear ();
            vewSitua.Items.Add(qTexto, qImag);
            cmdOK.Tag = qImag;
            if (qImag == 3)
            {
                janQuant.Visible = true;
                txQuant.Text = "";
                txQuant.Focus();
            }
            else
            {
                cmdOK.Visible = true;
                cmdOK.Focus();
            }
        }

        private void txQuant_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)Keys.Enter)
            {
                if (txQuant.Text.Length > 0)
                {
                    e.Handled = true;
                    cmdOK.Visible = true;
                    cmdOK.Focus(); 
                }
                return;
            }
            if ((e.KeyChar != (char)Keys.Back) && (e.KeyChar < (char)Keys.D0 || e.KeyChar > (char)Keys.D9))
                e.Handled = true;
        }

        private void cmdOK_Click(object sender, EventArgs e)
        {
            myDBase.BeginTransaction(IsolationLevel.ReadCommitted);
            rotRet = cmdOK_Gera_Casos();
            if (rotRet != 0) return;
            myDBase.CommitTransaction();
            cmdOK.Visible = false;
            janQuant.Visible = false; 
            avisoOK.Visible = true;
            pulso.Enabled = true;
            int qIcon;
            string qSitua;
            if (aptStatus == "M")
            {
                qSitua = "MANUT";
                qIcon = 4;
            }
            else
            {
                if (aptLivre != "L") qIcon = 2;
                else qIcon = 0;
                if (aptStatus != "L")
                {
                    qSitua = "  SUJO";
                    qIcon = qIcon + 1;
                }
                else
                {
                    qSitua = " limpo";
                }
            }
            vewApto.Items[aptIdx].Text = "  " + nmApto.ToString("0_000")  + "   " + qSitua;
            vewApto.Items[aptIdx].ImageIndex = qIcon;
            vewApto.Items[aptIdx].Tag = aptLivre + aptStatus;
        }

        private int cmdOK_Gera_Casos()
        {
            Apartamento esteApto = new Apartamento(myDBase);
            esteApto.Apto = nmApto;
            switch ((int)cmdOK.Tag)
            {
                case 1:     // dar Saída
                    esteApto.Saída = DateTime.Today;
                    int dbRet = esteApto.SetSaída();
                    if (dbRet != 0)
                    {
                        MessageBox.Show("Favor avisar a RamaSoft" + "\n"
                            + "referência: SituaCmdOKSaída" + "\n" + esteApto.MsgErro,
                            "Erro no acesso ao Banco de Dados", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        myDBase.RollBackTransaction();
                        return dbRet;
                    }
                    rotRet = cmdOK_Gera_Faxina();
                    if (rotRet != 0)
                    {
                        myDBase.RollBackTransaction();
                        return rotRet;
                    }
                    rotRet = cmdOK_Gera_Histórico(1);
                    aptLivre = "L";
                    aptStatus = "S";
                    break;
                case 3:     // dar Entrada
                    esteApto.Entrada = DateTime.Today;
                    esteApto.Pessoas = Convert.ToInt32(txQuant.Text);
                    dbRet = esteApto.SetEntrada();
                    if (dbRet != 0)
                    {
                        MessageBox.Show("Favor avisar a RamaSoft" + "\n"
                            + "referência: SituaCmdOKEntrada" + "\n" + esteApto.MsgErro,
                            "Erro no acesso ao Banco de Dados", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        myDBase.RollBackTransaction();
                        return dbRet;
                    }
                    aptLivre = "O";
                    break;
                case 4:     // entrar em Manutenção
                    esteApto.Status = "M";
                    dbRet = esteApto.SetStatus();
                    if (dbRet != 0)
                    {
                        MessageBox.Show("Favor avisar a RamaSoft" + "\n"
                            + "referência: SituaCmdOKEntrManut" + "\n" + esteApto.MsgErro,
                            "Erro no acesso ao Banco de Dados", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        myDBase.RollBackTransaction();
                        return dbRet;
                    }
                    rotRet = cmdOK_Gera_Histórico(4);
                    aptStatus = "M";
                    break;
                case 6:     // programar Faxina
                    rotRet = cmdOK_Gera_Faxina();
                    break;
                case 7:     // sair da Manutenção
                    esteApto.Status = "S";
                    dbRet = esteApto.SetStatus();
                    if (dbRet != 0)
                    {
                        MessageBox.Show("Favor avisar a RamaSoft" + "\n"
                            + "referência: SituaCmdOKSairManut" + "\n" + esteApto.MsgErro,
                            "Erro no acesso ao Banco de Dados", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        myDBase.RollBackTransaction();
                        return dbRet;
                    }
                    rotRet = cmdOK_Gera_Histórico(7);
                    aptLivre = "L";
                    aptStatus = "S";
                    break;
            }
            if (rotRet != 0) myDBase.RollBackTransaction();
            return rotRet;
        }

        private int cmdOK_Gera_Faxina()
        {
            Tarefa newTafa = new Tarefa(myDBase);
            newTafa.Apto = nmApto;
            newTafa.Data = DateTime.Today;
            int dbRet = newTafa.Insert();
            if (dbRet != 0)
                MessageBox.Show("Favor avisar a RamaSoft" + "\n"
                    + "referência: SituaGeraTarefa" + "\n" + newTafa.MsgErro,
                    "Erro no acesso ao Banco de Dados", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return dbRet;
        }

        private int cmdOK_Gera_Histórico(int opção)
        {
            Histórico newHisto = new Histórico (myDBase);
            newHisto.Apto = nmApto; 
            switch (opção)
            {
                case 1:     // dar Saída
                    newHisto.Saída = DateTime.Today;  
                    int dbRet = newHisto.SetSaída();
                    if (dbRet != 0)
                        MessageBox.Show("Favor avisar a RamaSoft" + "\n"
                            + "referência: SituaHistoSaída" + "\n" + newHisto.MsgErro,
                            "Erro no acesso ao Banco de Dados", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return dbRet;
                case 3:     // dar Entrada
                    newHisto.Entrada = DateTime.Today;  
                    newHisto.Refere = "O";
                    newHisto.Pessoas = Convert.ToInt32(txQuant.Text);
                    dbRet = newHisto.Insert (); 
                    if (dbRet != 0)
                        MessageBox.Show("Favor avisar a RamaSoft" + "\n"
                            + "referência: SituaHistoEntrada" + "\n" + newHisto.MsgErro,
                            "Erro no acesso ao Banco de Dados", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return dbRet;
                case 4:     //por em Manutenção
                    newHisto.Entrada = DateTime.Today;  
                    newHisto.Refere = "M";
                    newHisto.Pessoas = 0;
                    dbRet = newHisto.Insert (); 
                    if (dbRet != 0)
                        MessageBox.Show("Favor avisar a RamaSoft" + "\n"
                            + "referência: SituaHistoEntrManut" + "\n" + newHisto.MsgErro,
                            "Erro no acesso ao Banco de Dados", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return dbRet;
                case 7:      // sair da Manutenção
                    newHisto.Saída = DateTime.Today;  
                    dbRet = newHisto.SetSaída();
                    if (dbRet != 0)
                        MessageBox.Show("Favor avisar a RamaSoft" + "\n"
                            + "referência: SituaHistoSairManut" + "\n" + newHisto.MsgErro,
                            "Erro no acesso ao Banco de Dados", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return dbRet;
            }
            return 0;
        }

        private void pulso_Tick(object sender, EventArgs e)
        {
            pulso.Enabled = false; 
            janApto.Visible = false; 
        }
    }
}
